import { PrismaClient } from '@prisma/client';
import * as bcrypt from 'bcrypt';

const prisma = new PrismaClient();

async function testAuthFlow() {
  console.log('🧪 开始测试认证流程...\n');

  try {
    // 清理测试数据
    console.log('1. 清理测试数据...');
    await prisma.user.deleteMany({
      where: {
        email: {
          in: [
            'test@example.com',
            'login-test@example.com',
            'existing@example.com',
          ],
        },
      },
    });
    console.log('✅ 测试数据清理完成\n');

    // 测试用户注册
    console.log('2. 测试用户注册...');
    const registerData = {
      email: 'test@example.com',
      password: await bcrypt.hash('123456', 10),
      name: '测试用户',
      role: 'USER' as const,
    };

    const newUser = await prisma.user.create({
      data: registerData,
    });

    console.log('✅ 用户注册成功:');
    console.log(`   ID: ${newUser.id}`);
    console.log(`   邮箱: ${newUser.email}`);
    console.log(`   姓名: ${newUser.name}`);
    console.log(`   角色: ${newUser.role}\n`);

    // 测试密码验证
    console.log('3. 测试密码验证...');
    if (newUser.password) {
      const isPasswordValid = await bcrypt.compare('123456', newUser.password);
      console.log(
        `   密码验证结果: ${isPasswordValid ? '✅ 正确' : '❌ 错误'}\n`,
      );
    } else {
      console.log('❌ 用户密码为空\n');
    }

    // 测试重复注册
    console.log('4. 测试重复注册...');
    try {
      await prisma.user.create({
        data: registerData,
      });
      console.log('❌ 应该抛出错误但成功了');
    } catch (error) {
      console.log('✅ 重复注册被正确阻止');
    }

    // 测试用户查询
    console.log('\n5. 测试用户查询...');
    const foundUser = await prisma.user.findUnique({
      where: { email: 'test@example.com' },
    });

    if (foundUser) {
      console.log('✅ 用户查询成功');
      console.log(`   找到用户: ${foundUser.name}`);
    } else {
      console.log('❌ 用户查询失败');
    }

    // 测试不存在的用户
    console.log('\n6. 测试查询不存在的用户...');
    const nonExistentUser = await prisma.user.findUnique({
      where: { email: 'nonexistent@example.com' },
    });

    if (!nonExistentUser) {
      console.log('✅ 正确返回 null');
    } else {
      console.log('❌ 不应该找到用户');
    }

    console.log('\n🎉 所有测试通过！');
  } catch (error) {
    console.error('❌ 测试失败:', error);
  } finally {
    await prisma.$disconnect();
  }
}

// 运行测试
testAuthFlow();
